Add gdk_window_get_children_with_user_data
authorAlexander Larsson <alexl@redhat.com>
Fri, 3 May 2013 08:39:24 +0000 (10:39 +0200)
committerAlexander Larsson <alexl@redhat.com>
Tue, 7 May 2013 14:40:17 +0000 (16:40 +0200)
This function returns all the children that has a specific user_data set.
This is used a lot in the new GtkWidget drawing code and doing
it this way is faster than getting every child and calling get_user_data
on each (which was a non-neglible part of the profiles). Additionally it
also allows use to use some kind of hashtable to make this operation even
faster if needed in the future.

gdk/gdkwindow.c
gdk/gdkwindow.h

index 39ccda0b68074a0bcb0392bf79267adfea67e0dd..7a9b0c3657cbb4e0b84f6183bd5c802c56c14259 100644 (file)
@@ -2399,6 +2399,47 @@ gdk_window_peek_children (GdkWindow *window)
   return window->children;
 }
 
+
+/**
+ * gdk_window_get_children_with_user_data:
+ * @window: a #GdkWindow
+ *
+ * Gets the list of children of @window known to GDK with a particular
+ * user_data set on it.
+ *
+ * The returned list must be freed, but the elements in the
+ * list need not be.
+ *
+ * The list is returned in (relative) stacking order, i.e. the
+ * lowest window is first.
+ *
+ * Return value: (transfer container) (element-type GdkWindow):
+ *     list of child windows inside @window
+ **/
+GList *
+gdk_window_get_children_with_user_data (GdkWindow *window, gpointer user_data)
+{
+  GdkWindow *child;
+  GList *res, *l;
+
+  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+
+  if (GDK_WINDOW_DESTROYED (window))
+    return NULL;
+
+  res = NULL;
+  for (l = window->children; l != NULL; l = l->next)
+    {
+      child = l->data;
+
+      if (child->user_data == user_data)
+       res = g_list_prepend (res, child);
+    }
+
+  return res;
+}
+
+
 /**
  * gdk_window_add_filter: (skip)
  * @window: (allow-none): a #GdkWindow
index 73e6f86494f7bcd7efd73181b7041a306b986077..ddc8e70ca5501237e7080b2d49588782c881d3e6 100644 (file)
@@ -856,6 +856,10 @@ GDK_AVAILABLE_IN_ALL
 GList *              gdk_window_get_children    (GdkWindow       *window);
 GDK_AVAILABLE_IN_ALL
 GList *       gdk_window_peek_children   (GdkWindow       *window);
+GDK_AVAILABLE_IN_3_10
+GList *       gdk_window_get_children_with_user_data (GdkWindow *window,
+                                                     gpointer user_data);
+
 GDK_AVAILABLE_IN_ALL
 GdkEventMask  gdk_window_get_events     (GdkWindow       *window);
 GDK_AVAILABLE_IN_ALL